home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / comms / other / novia / src / novia_xpr.c < prev    next >
C/C++ Source or Header  |  1999-12-06  |  25KB  |  924 lines

  1. #include <exec/types.h>
  2.  
  3. #include <novia/novia_global.h>
  4. #include <novia/novia_misc.h>
  5. #include <novia/novia_funcs.h>
  6.  
  7. #include <pragma/xpr_lib.h>
  8. #include <pragma/gadtools_lib.h>
  9. #include <graphics/gfxmacros.h>
  10. #include <libraries/xprzmodem.h>
  11. #include <libraries/xproto.h>
  12.  
  13. struct Library *XProtocolBase;
  14. XPR_IO xprio;
  15. LONG warnung;
  16. UWORD lastgs;
  17. void InitXPrReq();
  18.  
  19. VOID wprintf(struct RastPort *rp, UWORD x, UWORD y, UBYTE *string, ...)
  20. {
  21.     UBYTE buffer[256];
  22.  
  23.     vsprintf(buffer, string, (va_list)(&string + 1));
  24.  
  25.     Move(rp, x, y+6);
  26.     Text(rp, buffer, strlen(buffer));
  27. }
  28.  
  29.  
  30. void settimer(long micros)
  31. {
  32.     struct PortData *cport;
  33.     if ((cport = (PortData *) FindTask(NULL)->tc_UserData))
  34.     {
  35.         int secs=0;
  36.         if (micros > 1000000)
  37.         {
  38.             secs    = micros / 1000000;
  39.             micros = micros % 1000000;
  40.         }
  41.         if (!CheckIO((IORequest *)cport->TimerReq))
  42.         {
  43.             AbortIO((IORequest *)cport->TimerReq);
  44.             WaitIO((IORequest *)cport->TimerReq);
  45.         }
  46.         cport->TimerReq->tr_time.tv_micro=micros; 
  47.         cport->TimerReq->tr_time.tv_secs=secs;
  48.         cport->TimerReq->tr_node.io_Command=TR_ADDREQUEST;
  49.         SendIO((IORequest *)cport->TimerReq);
  50.     }
  51. }
  52.  
  53. BOOL OpenXPrWindow()
  54. {
  55.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  56.     struct Gadget        *glist, *Gadgets[2], *g;
  57.     struct NewGadget    ng;
  58.  
  59.     if(cport->xprwin)    return(TRUE);
  60.  
  61.     if(cport->xprwin = OpenWindowTags(NULL,
  62.         WA_Width,            600,
  63.         WA_Height,            184,
  64.         WA_Left,                (cport->win->WScreen->Width - 600) >> 1,
  65.         WA_Top,                (cport->win->WScreen->Height - 184) >> 1,
  66.         WA_Activate,        FALSE,
  67.         WA_DragBar,            TRUE,
  68.         WA_DepthGadget,    TRUE,
  69.         WA_CloseGadget,    TRUE,
  70.         WA_RMBTrap,            TRUE,
  71.         WA_IDCMP,            IDCMP_CLOSEWINDOW | IDCMP_GADGETUP,
  72.         WA_Title,            "NOViA ZModem Transfer Window",
  73. //        WA_CustomScreen,    cport->win->WScreen,
  74.         TAG_DONE))
  75.     {
  76. //        BlockWindow(Win1);
  77. //        BlockWindow(Win2);
  78.  
  79. #define LEFTX 15
  80. #define RIGHTX 310
  81.  
  82.         SetAPen(cport->xprwin->RPort, (cport->clientconfig.Colors == 1 ? 1 : 2));
  83.  
  84.         wprintf(cport->xprwin->RPort, LEFTX,        18,    "Selected Protocol.:");
  85.         wprintf(cport->xprwin->RPort, LEFTX,        31,    "Last XPr-Message..:");
  86.         wprintf(cport->xprwin->RPort, LEFTX,        41,    "Last XPr-Error....:");
  87.         wprintf(cport->xprwin->RPort, LEFTX,        54,    "Current Filename..:");
  88.         wprintf(cport->xprwin->RPort, LEFTX,        64,    "Current Filesize..:");
  89.         wprintf(cport->xprwin->RPort, LEFTX,        81,    "Bytes Transferred.:");
  90.         wprintf(cport->xprwin->RPort, LEFTX,        91,    "Blocks Transferred:");
  91.         wprintf(cport->xprwin->RPort, LEFTX,        101,    "Block Size........:");
  92.         wprintf(cport->xprwin->RPort, LEFTX,        111,    "Block Check Type..:");
  93.         wprintf(cport->xprwin->RPort, LEFTX,        127,    "Estimated Time....:");
  94.         wprintf(cport->xprwin->RPort, LEFTX,        137,    "Elapsed Time......:");
  95.         wprintf(cport->xprwin->RPort, RIGHTX,    81,    "Data Rate [CPS]...:");
  96.         wprintf(cport->xprwin->RPort, RIGHTX,    91,    "Charakter Delay...:");
  97.         wprintf(cport->xprwin->RPort, RIGHTX,    101,    "Packet Delay......:");
  98.         wprintf(cport->xprwin->RPort, RIGHTX,    111,    "Packet Type.......:");
  99.         wprintf(cport->xprwin->RPort, RIGHTX,    127,    "Number Of Errors..:");
  100.         wprintf(cport->xprwin->RPort, RIGHTX,    137,    "Number Of Timeouts:");
  101.  
  102. #define XLEFT    178
  103. #define XRIGHT    472
  104.  
  105.         SetAPen(cport->xprwin->RPort, 7);
  106.  
  107.         wprintf(cport->xprwin->RPort, XLEFT,        18,    "- unknown -");
  108.         wprintf(cport->xprwin->RPort, XLEFT,        31,    "- none -");
  109.         wprintf(cport->xprwin->RPort, XLEFT,        41,    "- none -");
  110.         wprintf(cport->xprwin->RPort, XLEFT,        54,    "- unknown -");
  111.         wprintf(cport->xprwin->RPort, XLEFT,        64,    "-");
  112.         wprintf(cport->xprwin->RPort, XLEFT,        81,    "-");
  113.         wprintf(cport->xprwin->RPort, XLEFT,        91,    "-");
  114.         wprintf(cport->xprwin->RPort, XLEFT,        101,    "-");
  115.         wprintf(cport->xprwin->RPort, XLEFT,        111,    "--");
  116.         wprintf(cport->xprwin->RPort, XLEFT,        127,    "--:--:--");
  117.         wprintf(cport->xprwin->RPort, XLEFT,        137,    "--:--:--");
  118.         wprintf(cport->xprwin->RPort, XRIGHT,    81,    "-");
  119.         wprintf(cport->xprwin->RPort, XRIGHT,    91,    "-");
  120.         wprintf(cport->xprwin->RPort, XRIGHT,    101,    "-");
  121.         wprintf(cport->xprwin->RPort, XRIGHT,    111,    "--");
  122.         wprintf(cport->xprwin->RPort, XRIGHT,    127,    "-");
  123.         wprintf(cport->xprwin->RPort, XRIGHT,    137,    "-");
  124.  
  125.         DrawBevelBox(cport->xprwin->RPort, XLEFT - 8, 15, 416, 59,
  126.             GTBB_Recessed,    TRUE,
  127.             GT_VisualInfo,    cport->vinfo,
  128.             TAG_DONE );
  129.         DrawBevelBox(cport->xprwin->RPort, XLEFT - 8, 78, 122, 43,
  130.             GTBB_Recessed,    TRUE,
  131.             GT_VisualInfo,    cport->vinfo,
  132.             TAG_DONE );
  133.         DrawBevelBox(cport->xprwin->RPort, XRIGHT - 8, 78, 122, 43,
  134.             GTBB_Recessed,    TRUE,
  135.             GT_VisualInfo,    cport->vinfo,
  136.             TAG_DONE );
  137.         DrawBevelBox(cport->xprwin->RPort, XLEFT - 8, 124, 122, 23,
  138.             GTBB_Recessed,    TRUE,
  139.             GT_VisualInfo,    cport->vinfo,
  140.             TAG_DONE );
  141.         DrawBevelBox(cport->xprwin->RPort, XRIGHT - 8, 124, 122, 23,
  142.             GTBB_Recessed,    TRUE,
  143.             GT_VisualInfo,    cport->vinfo,
  144.             TAG_DONE );
  145.  
  146.         DrawBevelBox(cport->xprwin->RPort, LEFTX, 152, 571, 10,
  147.             GTBB_Recessed,    TRUE,
  148.             GT_VisualInfo,    cport->vinfo,
  149.             TAG_DONE );
  150.  
  151.         SetAPen(cport->xprwin->RPort, 0);
  152.         RectFill(cport->xprwin->RPort, LEFTX + 2, 153, 564 + LEFTX + 2, 160);
  153.         SetAPen(cport->xprwin->RPort, 7);
  154.  
  155. /*        if(g = CreateContext(&glist))
  156.         {
  157.             ng.ng_LeftEdge        = LEFTX + 24;
  158.             ng.ng_TopEdge        = 167;
  159.             ng.ng_Width            = 200;
  160.             ng.ng_Height        = 11;
  161.             ng.ng_GadgetText    = "Abort Entire Transfer";
  162. //            ng.ng_TextAttr        = &FontAttr;
  163.             ng.ng_GadgetID        = 1;
  164.             ng.ng_Flags            = PLACETEXT_IN;
  165.             ng.ng_VisualInfo    = cport->vinfo;
  166.  
  167.             Gadgets[0] =
  168.             g = CreateGadget(BUTTON_KIND, g, &ng,
  169.                     TAG_DONE);
  170.  
  171.             ng.ng_LeftEdge        = LEFTX + 344;
  172.             ng.ng_GadgetText    = "Skip Current File";
  173.             ng.ng_GadgetID        = 2;
  174.  
  175.             Gadgets[1] =
  176.             g = CreateGadget(BUTTON_KIND, g, &ng,
  177.                     TAG_DONE);
  178.  
  179.             AddGList(cport->xprwin, glist, 0, -1, NULL);
  180.             RefreshGList(glist, cport->xprwin, NULL, -1);
  181.             GT_RefreshWindow(cport->xprwin, NULL);
  182.         }*/
  183.  
  184.         return(TRUE);
  185.     }
  186.  
  187.     return(FALSE);
  188. }
  189.  
  190.  
  191. void CloseXPrWindow()
  192. {
  193.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  194.     if(cport->xprwin)
  195.     {
  196. //        FreeGadgets(cport->xprwin->FirstGadget);
  197.  
  198. //        ReleaseWindow(Win1);
  199. //        ReleaseWindow(Win2);
  200.  
  201.         CloseWindow(cport->xprwin);
  202.         cport->xprwin = NULL;
  203.     }
  204. }
  205.  
  206.  
  207.  
  208. extern "Asm" LONG xpr_fopen(register __a3 struct XPR_IO *io,register __a0 char *filename,register __a1 char *accessmode)
  209. {
  210.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  211.     BPTR fh        = NULL;        // filehandle of opening file
  212.     BPTR lock    = NULL;        // test lock
  213.     if (cport->xprwin) EraseRect(cport->xprwin->RPort,21,91,499,100); lastgs=0;
  214.     switch(*accessmode)
  215.     {
  216.         case 'r':                                // Open as read
  217.             if (accessmode[1]=='+')
  218.                 fh = Open(filename, MODE_READWRITE);
  219.             else
  220.                 fh = Open(filename, MODE_OLDFILE);
  221.             break;
  222.         case 'w':                                // Open as write
  223.             if(accessmode[1] == '+')
  224.             {
  225.                 // first, locking for exist file
  226.                 if(lock = Lock(filename, ACCESS_WRITE))
  227.                 {
  228.                     UnLock(lock);                // unlock and delete old file
  229.                     DeleteFile(filename);
  230.                 }
  231.                 fh = Open(filename, MODE_READWRITE);
  232.             }
  233.             else
  234.                 fh = Open(filename, MODE_NEWFILE);
  235.             break;
  236.         case 'a':                                // Open file as writewrite (to add data)
  237.             if(lock = Lock(filename, ACCESS_WRITE))
  238.             {
  239.                 UnLock(lock);
  240.                 if(fh = Open(filename, MODE_READWRITE))
  241.                 {
  242.                     if(Seek(fh, 0, OFFSET_END) == -1)
  243.                     {
  244.                         Close(fh);
  245.                         fh = NULL;
  246.                     }
  247.                 }
  248.             }
  249.             else
  250.                 fh = Open(filename, MODE_NEWFILE);
  251.             break;
  252.     }
  253.     return((LONG)fh);
  254. }
  255.  
  256.  
  257. extern "Asm" LONG xpr_fclose(register __a3 struct XPR_IO *io,register __a0 void *fileptr)        /* this function close the file */
  258. {
  259.     if(fileptr) Close((BPTR)fileptr);
  260.     return(0);
  261. }
  262.  
  263.  
  264.  
  265.  
  266. /*** next function is to read data from file ***/
  267.  
  268. extern "Asm" LONG xpr_fread(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 LONG size,register __d1 LONG count,register __a1 void *fileptr)
  269. {
  270.     return(Read((BPTR)fileptr, buffer, size * count));   // ??? /size ???
  271. }
  272.  
  273.  
  274.  
  275.  
  276. /*** this functions write data in file ***/
  277.  
  278. extern "Asm" LONG xpr_fwrite(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 LONG size,register __d1 LONG count,register __a1 void *fileptr)
  279. {
  280.     return(Write((BPTR)fileptr, buffer, size * count));  // ??? /size ???
  281. }
  282.  
  283.  
  284.  
  285.  
  286.  
  287. /*** this function read data from serial.device ***/
  288.  
  289. extern "Asm" LONG xpr_sread(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 LONG size,register __d1 LONG timeout)
  290. {
  291.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;        // get cport structure
  292.     ULONG    signalset,                                                    // Recieve SignalMask
  293.             sersig,                                                        // SerRead SignalBit
  294.             winsig,                                                        // SigBit for IDCMP-Messages
  295.             timesig;                                                        // TimeReq SignalBit
  296.     ULONG    length = 0;                                                    // datalength in seralbuffer
  297.  
  298.     struct SerialNetwork *sn;
  299.  
  300.     if ((cport = (PortData *)FindTask(NULL)->tc_UserData))
  301.     {
  302.         if (cport->network.isopen && cport->network.online)
  303.         {
  304.             if (cport->network.networktype == NETWORKTYPE_SERIAL)
  305.             {
  306.                 if ((sn = cport->network.networkdata))
  307.                 {
  308.                     if (!timeout)                                                        // == no timeout
  309.                     {
  310.                         sn->SerQuery->IOSer.io_Command    = SDCMD_QUERY;
  311.                         DoIO((IORequest *)sn->SerQuery);                                // read device status
  312.                 
  313.                         if ((length = sn->SerQuery->IOSer.io_Actual))                // check for data in seria-buffer ?
  314.                         {
  315.                             if (length > (ULONG)size)    length = (ULONG)size;
  316.                             sn->SerRead->IOSer.io_Length        = length;
  317.                             sn->SerRead->IOSer.io_Data        = buffer;
  318.                             sn->SerRead->IOSer.io_Command    = CMD_READ;
  319.                             DoIO((IORequest *)sn->SerRead);                            // copy serialdate to buffer
  320.                             length = sn->SerRead->IOSer.io_Actual;
  321.                         }
  322.                         
  323.                     }
  324.                     else                                                                // timeout ?
  325.                     {
  326.                         char quit=FALSE;
  327.                         settimer(timeout);                                                // reset timer
  328.                 
  329.                         sn->SerRead->IOSer.io_Command    = CMD_READ;
  330.                         sn->SerRead->IOSer.io_Data        = buffer;
  331.                         sn->SerRead->IOSer.io_Length        = size;
  332.                 
  333.                         sersig    = 1 << sn->SerReadPort->mp_SigBit;                    // Get SerRead SigBit
  334.                         timesig    = 1 << cport->TimePort->mp_SigBit;                        // Get TimeReq SigBit
  335.                         if (cport->xprwin)
  336.                             winsig= 1 << cport->xprwin->UserPort->mp_SigBit;            // Get Window UserPort SigBit
  337.                         else
  338.                             winsig=0;
  339.                         SetSignal(0, sersig | timesig);
  340.                 
  341.                         SendIO((IORequest *)sn->SerRead);
  342.                 
  343.                         signalset = Wait(sersig | timesig | winsig);
  344.                 
  345.                         if (cport->ProgramClose)
  346.                         {
  347.                             AbortIO((IORequest *)sn->SerRead);
  348.                             WaitIO((IORequest *)sn->SerRead);
  349.                             AbortIO((IORequest *)cport->TimerReq);
  350.                             WaitIO((IORequest *)cport->TimerReq);
  351.                             return (-1);
  352.                         }
  353.                         else
  354.                         {
  355.                             if (sersig & signalset)
  356.                             {
  357.                                 length=sn->SerRead->IOSer.io_Actual;
  358.                 //                if (!(CheckIO((IORequest *)cport->TimerReq)))        // Abort TimeReq
  359.                                 {
  360.                                     AbortIO((IORequest *)cport->TimerReq);            
  361.                                     WaitIO((IORequest *)cport->TimerReq);
  362.                                 }
  363.                             }
  364.                             if (timesig & signalset)
  365.                             {
  366.                 //                if (!(CheckIO((IORequest *)sn->SerRead)))
  367.                                 {
  368.                                     AbortIO((IORequest *)sn->SerRead);
  369.                                     WaitIO((IORequest *)sn->SerRead);
  370.                                 }
  371.                                 length = sn->SerRead->IOSer.io_Actual;
  372.                             }
  373.                         }
  374.                     }
  375.                 }
  376.             }
  377.         }
  378.     }
  379.     return length;
  380. }
  381.  
  382.  
  383.  
  384. /*** function send buffer to serial.device ***/
  385.  
  386. extern "Asm" LONG xpr_swrite(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 LONG size)
  387. {
  388.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;        // get userdate
  389.  
  390.     struct SerialNetwork *sn;
  391.  
  392.     if ((cport = (PortData *)FindTask(NULL)->tc_UserData))
  393.     {
  394.         if (cport->network.isopen && cport->network.online)
  395.         {
  396.             if (cport->network.networktype == NETWORKTYPE_SERIAL)
  397.             {
  398.                 if ((sn = cport->network.networkdata))
  399.                 {
  400.                     if (size)                                                            // check size
  401.                     {
  402.                         sn->SerWrite->IOSer.io_Length  = size;
  403.                         sn->SerWrite->IOSer.io_Data    = buffer;
  404.                         sn->SerWrite->IOSer.io_Command = CMD_WRITE;
  405.  
  406.                         DoIO((struct IORequest *)sn->SerWrite);                            // Send buffer
  407.                         return((long)sn->SerWrite->IOSer.io_Error);
  408.                     }
  409.                 }
  410.             }
  411.         }
  412.     }
  413.     else
  414.         return (-1);
  415. }
  416.  
  417.  
  418. /*** function to flush serial.device ***/
  419.  
  420. extern "Asm" LONG xpr_sflush(register __a3 struct XPR_IO *io)
  421. {
  422.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  423.     struct SerialNetwork *sn;
  424.  
  425.     if ((cport = (PortData *)FindTask(NULL)->tc_UserData))
  426.     {
  427.         if (cport->network.isopen && cport->network.online)
  428.         {
  429.             if (cport->network.networktype == NETWORKTYPE_SERIAL)
  430.             {
  431.                 if ((sn = cport->network.networkdata))
  432.                 {
  433.  
  434.                     sn->SerQuery->IOSer.io_Command = CMD_FLUSH;
  435.                     DoIO((struct IORequest *)sn->SerQuery);
  436.                     return((long)sn->SerQuery->IOSer.io_Error);
  437.                 }
  438.             }
  439.         }
  440.     }
  441. }
  442.  
  443.  
  444. /*** this function update the xpr-window ***/
  445.  
  446. extern "Asm" LONG xpr_update(register __a3 struct XPR_IO *io,register __a0 struct XPR_UPDATE *Update)
  447. {
  448.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  449.     if(!cport->xprwin)    return(0);
  450.  
  451.     if(Update)
  452.     {
  453.         if(Update->xpru_updatemask & XPRU_PROTOCOL)
  454.             wprintf(cport->xprwin->RPort, XLEFT, 18, "%-50.50ls", Update->xpru_protocol);
  455.  
  456.         if(Update->xpru_updatemask & XPRU_MSG)
  457.             wprintf(cport->xprwin->RPort, XLEFT, 31, "%-50.50ls", Update->xpru_msg);
  458.  
  459.         if(Update->xpru_updatemask & XPRU_ERRORMSG)
  460.             wprintf(cport->xprwin->RPort, XLEFT, 41, "%-50.50ls", Update->xpru_errormsg);
  461.  
  462.         if(Update->xpru_updatemask & XPRU_FILENAME)
  463.             wprintf(cport->xprwin->RPort, XLEFT, 54, "%-50.50ls", Update->xpru_filename);
  464.  
  465.         if(Update->xpru_updatemask & XPRU_FILESIZE)
  466.         {
  467.             wprintf(cport->xprwin->RPort, XLEFT, 64, "%-50.50ld", Update->xpru_filesize);
  468.             warnung = Update->xpru_filesize;
  469.         }
  470.  
  471.         if(Update->xpru_updatemask & XPRU_BYTES)
  472.         {
  473.             wprintf(cport->xprwin->RPort, XLEFT, 81, "%-13.13ld", Update->xpru_bytes);
  474.             if(warnung > 0)
  475.             {
  476.                 ULONG Check = 0x5555AAAA;            // __chip
  477.  
  478.                 SetAfPt(cport->xprwin->RPort, (UWORD *)&Check, 1);
  479.                 RectFill(cport->xprwin->RPort, LEFTX + 2, 153, ((Update->xpru_bytes * 563) / warnung) + LEFTX + 3, 160);
  480.                 SetAfPt(cport->xprwin->RPort, NULL, 0);
  481.             }
  482.         }
  483.  
  484.         if(Update->xpru_updatemask & XPRU_BLOCKS)
  485.             wprintf(cport->xprwin->RPort, XLEFT, 91, "%-13.13ld", Update->xpru_blocks);
  486.  
  487.         if(Update->xpru_updatemask & XPRU_BLOCKSIZE)
  488.             wprintf(cport->xprwin->RPort, XLEFT, 101, "%-13.13ld", Update->xpru_blocksize);
  489.  
  490.         if(Update->xpru_updatemask & XPRU_BLOCKCHECK)
  491.             wprintf(cport->xprwin->RPort, XLEFT, 111, "%-13.13ls", Update->xpru_blockcheck);
  492.  
  493.         if(Update->xpru_updatemask & XPRU_EXPECTTIME)
  494.             wprintf(cport->xprwin->RPort, XLEFT, 127, "%-13.13ls", Update->xpru_expecttime);
  495.  
  496.         if(Update->xpru_updatemask & XPRU_ELAPSEDTIME)
  497.             wprintf(cport->xprwin->RPort, XLEFT, 137, "%-13.13ls", Update->xpru_elapsedtime);
  498.  
  499.         if(Update->xpru_updatemask & XPRU_DATARATE)
  500.             wprintf(cport->xprwin->RPort, XRIGHT, 81, "%-13.13ld", Update->xpru_datarate);
  501.  
  502.         if(Update->xpru_updatemask & XPRU_CHARDELAY)
  503.             wprintf(cport->xprwin->RPort, XRIGHT, 91, "%-13.13ld", Update->xpru_chardelay);
  504.  
  505.         if(Update->xpru_updatemask & XPRU_PACKETDELAY)
  506.             wprintf(cport->xprwin->RPort, XRIGHT, 101, "%-13.13ld", Update->xpru_packetdelay);
  507.  
  508.         if(Update->xpru_updatemask & XPRU_PACKETTYPE)
  509.             wprintf(cport->xprwin->RPort, XRIGHT, 111, "%-13.13ls", Update->xpru_packettype);
  510.  
  511.         if(Update->xpru_updatemask & XPRU_ERRORS)
  512.             wprintf(cport->xprwin->RPort, XRIGHT, 127, "%-13.13ld", Update->xpru_errors);
  513.  
  514.         if(Update->xpru_updatemask & XPRU_TIMEOUTS)
  515.             wprintf(cport->xprwin->RPort, XRIGHT, 137, "%-13.13ld", Update->xpru_timeouts);
  516.     }
  517.  
  518.     return(1);
  519. }
  520.  
  521.  
  522. /*** function to check AbbortTransfer from XPR-Window Close Gadget ***/
  523.  
  524. extern "Asm" LONG xpr_chkabort(register __a3 struct XPR_IO *io)
  525. {
  526.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  527.     struct IntuiMessage *imsg;
  528.     struct Gadget *gadget;
  529.     ULONG class;
  530.  
  531.     if(cport->xprwin)
  532.     {
  533.         struct IntuiMessage    *imsg=NULL;
  534.         while((imsg = (struct IntuiMessage *)GetMsg(cport->xprwin->UserPort)))
  535.         {
  536.             if (imsg->Class==IDCMP_MENUPICK)
  537.             {
  538.                 return(-1);    /* Abort transfer */
  539. //                return(1);    /* Skip file */
  540.             }
  541.             ReplyMsg((struct Message *)imsg);
  542.         }
  543.         if (cport->ProgramClose | !cport->network.online)
  544.             return(-1);
  545.     }
  546.     return(0);    // no abort
  547. }
  548.  
  549.  
  550.  
  551. /***        the following functions are not implemented yet.
  552.  
  553.  extern "Asm" LONG xpr_chkmisc(register __a3 struct XPR_IO *io)
  554.  extern "Asm" LONG xpr_gets(register __a3 struct XPR_IO *io,register __a0 char *prompt,register __a1 char *buffer)
  555.  
  556. ***/
  557.  
  558. extern "Asm" LONG xpr_setserial(register __a3 struct XPR_IO *io,register __d0 LONG newstatus)
  559. {
  560. #define ST_PARTYON    (1 << 0)
  561. #define ST_PARTYODD    (1 << 1)
  562. #define ST_7WIRE    (1 << 2)
  563. #define ST_QBREAK    (1 << 3)
  564. #define ST_RADBOOGIE    (1 << 4)
  565. #define ST_SHARED    (1 << 5)
  566. #define ST_EOFMODE    (1 << 6)
  567. #define ST_XDISABLED    (1 << 7)
  568. #define ST_PARTYMARKON    (1 << 8)
  569. #define ST_PARTYMARK    (1 << 9)
  570. #define ST_2BITS    (1 << 10)
  571. #define ST_READ7    (1 << 11)
  572. #define ST_WRITE7    (1 << 12)
  573. /*    struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  574.  
  575.     LONG rtn, i;
  576.     STATIC LONG XprBauds[12] = { 110, 300, 1200, 2400, 4800, 9600, 19200, 31250,
  577.         38400, 57600, 76800, 115200 };
  578.  
  579.  
  580.     sn->SerWrite->IOSer.io_Command = SDCMD_QUERY;
  581.     DoIO((IORequest *)sn->SerWrite);
  582.  
  583.     rtn = sn->SerWrite->io_SerFlags & 0xFF;
  584.  
  585.     if(sn->SerWrite->io_ExtFlags & SEXTF_MSPON)    rtn |= ST_PARTYMARKON;
  586.     if(sn->SerWrite->io_ExtFlags & SEXTF_MARK)        rtn |= ST_PARTYMARK;
  587.     if(sn->SerWrite->io_StopBits    == 2)                rtn |= ST_2BITS;
  588.     if(sn->SerWrite->io_ReadLen        == 7)                rtn |= ST_READ7;
  589.     if(sn->SerWrite->io_WriteLen    == 7)                rtn |= ST_WRITE7;
  590.  
  591.     for(i = 0 ; i < 12 ; i++)
  592.     {
  593.         if(sn->SerWrite->io_Baud == XprBauds[i])
  594.         {
  595.             rtn |= (i << 16);
  596.             break;
  597.         }
  598.     }
  599.  
  600.     if(Status != -1)
  601.     {
  602.         sn->SerWrite->IOSer.io_Command    = SDCMD_SETPARAMS;
  603.         sn->SerWrite->io_SerFlags        = Status & 0xFF;
  604.         sn->SerWrite->io_ExtFlags        = 0;
  605.  
  606.         if(Status & ST_PARTYMARKON)    sn->SerWrite->io_ExtFlags |= SEXTF_MSPON;
  607.         if(Status & ST_PARTYMARK)        sn->SerWrite->io_ExtFlags |= SEXTF_MARK;
  608.         if(Status & ST_2BITS)            sn->SerWrite->io_StopBits = 2;
  609.         else                                    sn->SerWrite->io_StopBits = 1;
  610.         if(Status & ST_READ7)            sn->SerWrite->io_ReadLen = 7;
  611.         else                                    sn->SerWrite->io_ReadLen = 8;
  612.         if(Status & ST_WRITE7)            sn->SerWrite->io_WriteLen = 7;
  613.         else                                    sn->SerWrite->io_WriteLen = 8;
  614.  
  615.         DoIO((IORequest *)sn->SerWrite);
  616.  
  617.         sn->SerRead->io_SerFlags    = sn->SerWrite->io_SerFlags;
  618.         sn->SerRead->io_ExtFlags    = sn->SerWrite->io_ExtFlags;
  619.         sn->SerRead->io_StopBits    = sn->SerWrite->io_StopBits;
  620.         sn->SerRead->io_ReadLen    = sn->SerWrite->io_ReadLen;
  621.         sn->SerRead->io_WriteLen    = sn->SerWrite->io_WriteLen;
  622.     }
  623.  
  624.     return(rtn);*/
  625.     return NULL;
  626. }
  627.  
  628.  
  629. /*** this function get the first filename from download list ***/
  630.  
  631. extern "Asm" LONG xpr_ffirst(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __a1 char *pattern)
  632. {
  633.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  634.     printf("ffirst: %s\n",pattern);
  635.     if (cport)
  636.     {
  637.         struct Item item;
  638.         if (cport->actual)
  639.         {
  640. //            if (GetItem_byIP(cport->actual->dirIP,cport->actual->itemIP,(Item *)&item,sizeof(Item)))
  641.             {
  642.                 if (item.itemheader.ItemType == ITEMTYPE_FILEITEM)
  643.                 {
  644.                     strcpy(buffer,item.Filename);
  645.                     printf("download : %s\n",buffer);
  646.                     warnung=item.Size;
  647.                     return (1);
  648.                 }
  649.             }
  650.         }
  651.     }
  652.     return(0);
  653. }
  654.  
  655.  
  656. extern "Asm" LONG xpr_fnext(register __a3 struct XPR_IO *io,register __d0 LONG oldstate,register __a0 char *buffer,register __a1 char *pattern)
  657. {
  658.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  659.  
  660.     printf("fnext: (%d) %s\n",oldstate,pattern);
  661.  
  662.     SetAPen(cport->xprwin->RPort, 0);
  663.     RectFill(cport->xprwin->RPort, LEFTX + 2, 153, 564 + LEFTX + 2, 160);
  664.     SetAPen(cport->xprwin->RPort, 7);
  665.  
  666.     if (cport)
  667.     {
  668.         struct SelectItem *select=cport->actual->ln_Succ;
  669.         char quit=FALSE;
  670.         while (select->ln_Succ && !quit)
  671.         {
  672.             if (select->downloadnow)
  673.             {
  674.                 cport->actual = select;
  675.                 quit = TRUE;
  676.             }
  677.             select=select->ln_Succ;
  678.         }
  679.         if (quit)
  680.         {
  681.             struct Item item;
  682.             if (cport->actual)
  683.             {
  684. //                if (GetItem_byIP(cport->actual->dirIP,cport->actual->itemIP,(Item *)&item,sizeof(Item)))
  685.                 {
  686.                     if (item.itemheader.ItemType == ITEMTYPE_FILEITEM)
  687.                     {
  688.                         strcpy(buffer,item.Filename);
  689.                         printf("next download : %s\n",buffer);
  690.                         warnung=item.Size;
  691.                         return (1);
  692.                     }
  693.                 }
  694.             }
  695.         }
  696.     }
  697.     return(0);
  698. }
  699.  
  700.  
  701. extern "Asm" LONG xpr_finfo(register __a3 struct XPR_IO *io,register __a0 char *filename,register __d0 LONG typeofinfo)
  702. {
  703.     struct FileInfoBlock *fib;
  704.     LONG result = NULL;
  705.     if ((fib = AllocDosObject(DOS_FIB,NULL)))        // Alloc FileInfoBlock
  706.     {
  707.         BPTR lock;
  708.         if ((lock = Lock(filename, SHARED_LOCK)))
  709.         {
  710.             if (Examine(lock, fib))
  711.                 result = fib->fib_Size;
  712.             UnLock(lock);
  713.             if (typeofinfo == 2)
  714.                 result=1;
  715.             else
  716.             {
  717.                 if(typeofinfo!=1)
  718.                     result = 0;
  719.             }
  720.         }
  721.         FreeDosObject(DOS_FIB,fib);
  722.     }
  723.     return(result);
  724. }
  725.  
  726.  
  727. /*** file to set position of file ***/
  728.  
  729. extern "Asm" LONG xpr_fseek(register __a3 struct XPR_IO *io,register __a0 void *fileptr,register __d0 LONG offset,register __d1 LONG origin)
  730. {
  731.     LONG accessmode = NULL;
  732.     switch(origin)
  733.     {
  734.         case 0:
  735.             accessmode = OFFSET_BEGINNING;
  736.             break;
  737.         case 1:
  738.             accessmode = OFFSET_CURRENT;
  739.             break;
  740.         case 2:
  741.             accessmode = OFFSET_END;
  742.             break;
  743.     }
  744.  
  745.     if (Seek((BPTR)fileptr, offset, accessmode) == -1)
  746.         return(-1);
  747.     else
  748.         return(0);
  749. }
  750.  
  751. /***
  752.   LONG__saveds __asm xpr_options(register __a3 struct XPR_IO *io,register __d0 LONG n,register __a0 struct xpr_option **opt)
  753. ***/
  754.  
  755.  
  756. /*** function to delete a file ***/
  757.  
  758. extern "Asm" LONG xpr_unlink(register __a3 struct XPR_IO *io,register __a0 char *filename)
  759. {
  760.     return(DeleteFile(filename));
  761. }
  762.  
  763.  
  764.  
  765. extern "Asm" LONG xpr_squery(register __a3 struct XPR_IO *io)
  766. {
  767.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  768.     struct SerialNetwork *sn;
  769.  
  770.     if ((cport = (PortData *)FindTask(NULL)->tc_UserData))
  771.     {
  772.         if (cport->network.isopen && cport->network.online)
  773.         {
  774.             if (cport->network.networktype == NETWORKTYPE_SERIAL)
  775.             {
  776.                 if ((sn = cport->network.networkdata))
  777.                 {
  778.                     sn->SerQuery->IOSer.io_Command = SDCMD_QUERY;
  779.                     if (!(DoIO((IORequest *)sn->SerRead)))
  780.                         return (sn->SerRead->IOSer.io_Actual);
  781.                     else
  782.                         return(-1);
  783.                 }
  784.             }
  785.         }
  786.     }
  787.     return NULL;
  788. }
  789.  
  790.  
  791.  
  792.  
  793.  
  794. /*
  795. extern "Asm" LONG xpr_getptr(register __a3 struct XPR_IO *io,register __d0 LONG type)
  796. {
  797.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  798.     return((type == 1 ? (LONG)cport->scr : -1));
  799. }
  800.  
  801. */
  802.  
  803. BOOL DoTransfer()
  804. {
  805.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  806.     struct Line *line;
  807.     BPTR newlock, oldlock;
  808.     LONG i;
  809.     BOOL ok;
  810.     char path[]="ram:";
  811.     char buffer[200];
  812.     struct SerialNetwork *sn;
  813.     xprio.xpr_filename = 0;
  814.  
  815.     if ((cport = (PortData *)FindTask(NULL)->tc_UserData))
  816.     {
  817.         if (cport->network.isopen && cport->network.online)
  818.         {
  819.             if (cport->network.networktype == NETWORKTYPE_SERIAL)
  820.             {
  821.                 if ((sn = cport->network.networkdata))
  822.                 {
  823.                     InitXPrReq();
  824.                     if (cport)
  825.                     {
  826.                         struct Item item;
  827.                         if (cport->actual)
  828.                         {
  829. //                            if (GetItem_byIP(cport->actual->dirIP,cport->actual->itemIP,(Item *)&item,sizeof(Item)))
  830.                             {
  831.                                 if (item.itemheader.ItemType == ITEMTYPE_FILEITEM)
  832.                                 {
  833.                                     xprio.xpr_filename = item.Filename;
  834.             
  835.                                     printf("download : %s\n",buffer);
  836.                                     warnung=item.Size;
  837.                                     return (1);
  838.                                 }
  839.                                 printf(" no file \n");
  840.                             }
  841.                             printf(" get io failat %d , %d\n",cport->actual->dirIP,cport->actual->itemIP);
  842.                         }
  843.                         else
  844.                             printf(" no actual \n");
  845.                     }
  846.             
  847.             
  848.                     ok = FALSE;
  849.                     if(XProtocolBase = OpenLibrary("xprzmodem.library", 0))
  850.                     {
  851.                         ULONG        XPrFlags;
  852.             
  853.                         XPrFlags = XProtocolSetup(&xprio);
  854.                         if(XPrFlags & XPRS_SUCCESS)
  855.                         {
  856.                             printf("sending \n");
  857.                             AbortIO((IORequest *)sn->SerRead);
  858.                             WaitIO((IORequest *)sn->SerRead);
  859.                             AbortIO((IORequest *)sn->SerWrite);
  860.                             WaitIO((IORequest *)sn->SerWrite);
  861.                 
  862.                             OpenXPrWindow();
  863.                 
  864.                 
  865.                             warnung = xpr_finfo(0,0,0);
  866.                             ok = XProtocolSend(&xprio);
  867.                 
  868.                 /*            warnung = 0;
  869.                             ok = XProtocolReceive(&xprio);
  870.                             warnung = i;*/
  871.                 
  872.                             printf("ok: %d i: %d\n",ok,i);
  873.                 
  874.                             CloseXPrWindow();
  875.                         }
  876.                         else
  877.                             printf("DoTransfer: XPrSetup() - Error\n");
  878.                 
  879.                         XProtocolCleanup(&xprio);
  880.                         CloseLibrary(XProtocolBase);
  881.                         XProtocolBase = NULL;
  882.                     }
  883.                     else
  884.                         printf("DoTransfer Konnte xpr.library nicht öffnen.\n");
  885.                 
  886.                     printf("Transfer Status : %ls\r\n", (ok ? "ok" : "failed"));
  887.                 
  888.                     printf("Transfer beendet");
  889.                 }
  890.                 return(FALSE);
  891.             }
  892.         }
  893.     }
  894. }
  895.  
  896.  
  897. VOID InitXPrReq(VOID)
  898. {
  899.     struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
  900.    xprio.xpr_filename    = NULL;
  901.     xprio.xpr_fopen        = xpr_fopen;
  902.     xprio.xpr_fclose        = xpr_fclose;
  903.     xprio.xpr_fread        = (long)xpr_fread;
  904.     xprio.xpr_fwrite        = (long)xpr_fwrite;
  905.     xprio.xpr_sread        = (long)xpr_sread;
  906.     xprio.xpr_swrite        = (long)xpr_swrite;
  907.     xprio.xpr_sflush        = (long)xpr_sflush;
  908.     xprio.xpr_update        = (long)xpr_update;
  909.     xprio.xpr_chkabort    = (long)xpr_chkabort;
  910.     xprio.xpr_gets            = NULL;                 // brauchen keine string-req
  911.     xprio.xpr_setserial    = (long)NULL;
  912.     xprio.xpr_ffirst        = (long)xpr_ffirst;
  913.     xprio.xpr_fnext        = (long)xpr_fnext;
  914.     xprio.xpr_finfo        = (long)xpr_finfo;
  915.     xprio.xpr_fseek        = (long)xpr_fseek;
  916.     xprio.xpr_data        = NULL;
  917.     xprio.xpr_extension    = 4;
  918.     xprio.xpr_options        = NULL;                // brauchen kein opt-window
  919.     xprio.xpr_unlink        = (long)NULL;
  920.     xprio.xpr_squery        = (long)NULL;
  921.     xprio.xpr_getptr        = (long)NULL;        // Extension 4
  922.     xprio.xpr_chkmisc        = NULL;                // brauchen das nicht...
  923. }
  924.